#ifndef MAMBA_SERVICE_ASPECT_HTTP_ASPECT_HPP
#define MAMBA_SERVICE_ASPECT_HTTP_ASPECT_HPP

#include <fas/aop/aspect.hpp>
#include <vector>

#include "ad_exception.hpp"

#include "http_reader.hpp"
#include "http_reader.hpp"

/**
  * Базовый http-aspect. Включает необходимый дополнительный набор адвайсов, которые будут включены во все 
  * http и comet сервера, и переопределяет читателей и писателей http по умолчанию
  */
namespace fasys{

namespace ah = ::fas::http;
namespace ad = ::fas::adv;
namespace ahw = ::fas::http::writer;
namespace ahr = ::fas::http::reader;
namespace adah = ::fas::adv::asp::http;
namespace adahs = ::fas::adv::asp::http::server;

struct default_header_reader: header_reader<> {};
struct default_body_reader: body_reader<> {};

struct default_header_writer: ahw::server_header_writer<> {};
struct default_body_writer: ahw::body_writer<> {};

struct default_server_reader: ah::ad_reader< default_header_reader, default_body_reader > {};
struct default_server_writer: ah::ad_writer< default_header_writer, default_body_writer > {};

struct default_server_reader_advice: aa::advice< aa::tag_list_n< aa::gtag<ad::_cleaner_>, adah::_reader_ >::type, default_server_reader> {};
struct default_server_writer_advice: aa::advice< aa::tag_list_n< aa::gtag<ad::_cleaner_>, adah::_writer_ >::type, default_server_writer> {};

// блокирует "отображение" html с ошибкой - просто закрывает соединение 
struct http_error_advice: aa::advice< adah::_http_error_,  ad_exception> {};

typedef ap::type_list_n<
  default_server_reader_advice,
  default_server_writer_advice,
  http_error_advice
>::type http_advice_list;

typedef aa::aspect<http_advice_list> http_aspect_base;

typedef aa::aspect_merge<
  adahs::aspect,
  http_aspect_base
>::type http_aspect;

}

#endif
